//
//  Settings.m
//  Truffle
//
//  Created by Ismaila Kredity on 08/02/10.
//  Copyright 2010 kredity. All rights reserved.
//

#import "DatasTruffle.h"
#import "DAOTruffle.h"
#import "Accueil.h"
#import "GatewayConnection.h"
#import "Settings.h"

// Couleur bleue utilisée dans les applications iPhone pour les champs de texte.
#define APPLE_BLUE [UIColor colorWithRed:50.0f/255.0f green:79.0f/255.0f blue:133.0f/255.0f alpha:1.0f]


@implementation Settings
@synthesize nickname, nicknameTextField, invisibleMode, invisibleModeSwitch, status, statusMenu, temporaryStatus, home;//, statusMenu;

// Fonction appellée lorsque la vue a été chargée.
- (void)viewDidLoad {
	// On appelle la fonctinon parente.
    [super viewDidLoad];
	
	// On est sur la page de préférences.
	self.title = @"Préférences";
	
	// On crée les deux boutons de la barre de menus.
	self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc]
											  initWithTitle:@"Annuler" style:UIBarButtonItemStyleBordered 
											  target:self action:@selector(cancel_Clicked:)] autorelease];
	
	self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]
											   initWithTitle:@"Enregistrer" style:UIBarButtonItemStyleBordered 
											   target:self action:@selector(save_Clicked:)] autorelease];

	// Bouton de retour utilisé lorsqu'on modifie le statut.
	self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc]
											  initWithTitle:@"Préférences" style:UIBarButtonItemStyleBordered 
											  target:self action:nil] autorelease];

	// Récupération des données de la base de données
	
	// On crée un dictionnaire.
	NSMutableDictionary *dictionary = [[DatasTruffle getDao] getInfoSelf];
	
	// On récupère le pseudo.
	[self setNickname:[dictionary objectForKey:@"pseudo"]];
	
	// On récupère le statut.
	[self setStatus:[dictionary objectForKey:@"status"]];
	
	// On récupère le statut du mode invisible (activé ou non).
	NSString *invisibleModeString = (NSString *)[dictionary objectForKey:@"visibility"];
	if (invisibleModeString == nil) invisibleModeString = @"1";
	[self setInvisibleMode:([invisibleModeString isEqualToString:@"0"])];
	
	
	// Champ de texte permettant de modifier la valeur du pseudo.
	nicknameTextField = [[[UITextField alloc] initWithFrame:CGRectMake(100, 12, 180, 30)] autorelease];
	
	// On utilise le bleu par défaut de l'interface d'Apple.
	nicknameTextField.textColor = APPLE_BLUE;
	
	// FIXME : récupérer le vrai pseudo (base de données?).
	// Si aucun pseudo n'est disponible, on utilise le pseudo par défaut.
	if([self nickname] == nil) [self setNickname:@"anonyme"];
	
	// Label du statut.
	statusLabel = [[[UILabel alloc] initWithFrame:CGRectMake(100, 12, 180, 20)] autorelease];
	
	// On aligne le texte à droite.
	[statusLabel setTextAlignment:UITextAlignmentRight];
	
	// On utilise le bleu par défaut de l'interface d'Apple.
	statusLabel.textColor = APPLE_BLUE;
	
	// Si aucun statut n'est mis, on choisit "Disponible" par défaut.
	// FIXME : récupérer le premier élément de la liste de statuts.
	if([self status] == nil) [self setStatus:@"Disponible"];

	// On met à jour notre variable temporaire.
	[self setTemporaryStatus:status];
	
	// Switch du mode invisible.
	invisibleModeSwitch = [[[UISwitch alloc] initWithFrame:CGRectMake(208, 9, 20, 100)] autorelease];
	
	// On met à jour l'interrupteur selon le mode invisible.
	[invisibleModeSwitch setOn:[self invisibleMode]];
}

// Fonction appellée lorsque la vue est sur le point d'être affichée.
- (void)viewWillAppear:(BOOL)animated
{
	// On met à jour le pseudo dans le champ de texte.
	[nicknameTextField setText:[self nickname]];
	
	// On met à jour la valeur du switch du mode invisible.
	[invisibleModeSwitch setOn:[self invisibleMode]];
	
	// On met à jour la valeur du label du statut.
	[statusLabel setText:[self temporaryStatus]];
}

// Combien y a-t-il de sections?
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
	// Il y en a deux.
	return 2;
}

// Combien de lignes par section?
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
	// Deux sections.
	switch (section) {
		// Une ligne dans la première.
		case 0 : return 1;
		// Deux lignes dans la seconde.
		case 1 : return 2;
	}
	
	return 0;
}

// Accessoires pour chaque élément de la liste.
- (UITableViewCellAccessoryType)tableView:(UITableView *)tv accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
{
	// Seul le bouton "Statut" a une flèche sur la droite.
	if ([indexPath section] == 1 && [indexPath row] == 0)
		return UITableViewCellAccessoryDisclosureIndicator;

	return UITableViewCellAccessoryNone;
}

// Fonction renvoyant la cellule à l'index path donné.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
	// Pointeur vers la cellule.
	UITableViewCell *cell;
	
	// Types de cellules.
	static NSString *cellWithTextFieldIdentifier = @"cellWithTextFieldIdentifier";
	static NSString *cellWithLabelIdentifier = @"cellWithLabelIdentifier";
	static NSString *cellWithSwitchIdentifier = @"cellWithSwitch";
	
	// Selon la section on a des comportements différents.
	switch ([indexPath section]) {
		// Section 0 : on traite le cas du champ du pseudo.
		case 0 :
			// On récupère la cellule.
			cell = [tableView dequeueReusableCellWithIdentifier:cellWithTextFieldIdentifier];
			
			// Si on n'a pas pu récupérer de cellule...
			if (cell == nil) {
				// ...on la crée.
				cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellWithTextFieldIdentifier] autorelease];
			}
			
			// On met à jour le nom de la cellule.
			cell.textLabel.text = @"Pseudo";
			
			// On ne peut pas sélectionner cette cellule.
			[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
			
			// On ajoute le champ de texte à la vue.
			[cell addSubview:nicknameTextField];
			
			break;
		
		// Section 1.
		case 1 :
			// L'action dépend de la ligne concernée.
			switch([indexPath row]) {
				// Ligne 0 : il s'agit de la ligne de choix du statut.
				case 0 :
					// On récupère la cellule.
					cell = [tableView dequeueReusableCellWithIdentifier:cellWithLabelIdentifier];
			
					// Si on n'a pas pu récupérer de cellule...
					if (cell == nil) {
						// ...on la crée.
						cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellWithLabelIdentifier] autorelease];
					}
			
					// On met à jour le nom de la cellule.
					cell.textLabel.text = @"Statut";
					
					// On ajoute le label à la vue.
					[cell addSubview:statusLabel];
			
					// On peut sélectionner cette cellule.
					[cell setSelectionStyle:UITableViewCellSelectionStyleBlue];
					
					break;
			
				// Ligne 1 : il s'agit de la ligne d'activation du mode invisible.
				case 1 :
					// On récupère la cellule.
					cell = [tableView dequeueReusableCellWithIdentifier:cellWithSwitchIdentifier];
			
					// Si on n'a pas pu récupérer de cellule...
					if (cell == nil) {
						// ...on la crée.
						cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellWithSwitchIdentifier] autorelease];
					}
			
					// On met à jour le nom de la cellule.
					cell.textLabel.text = @"Mode invisible";
			
					// On ajoute le switch à la vue.
					[cell addSubview:invisibleModeSwitch];
			
					// On ne peut pas sélectionner cette cellule.
					[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
					
					break;
			}
	}
	
	// On renvoie la cellule.
	return cell;
}

// Fonction appellée lorsqu'une ligne vient d'être sélectionnée.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{	
	// On la déselectionne.
	[tableView deselectRowAtIndexPath:indexPath animated:YES];
	
	// S'il ne s'agit pas de la ligne du choix du statut, on ne fait rien.
	if ([indexPath section] != 1 || [indexPath row] != 0) return;
	
	// Sinon, si nécessaire, on alloue le statusMenu.
	if(statusMenu == nil)
		statusMenu = [[[StatusMenu alloc] initWithNibName:@"StatusMenu" bundle:nil] autorelease];
	
	// On met à jour ses variables locales.
	// FIXME : déplacer vers le constructeur?
	[statusMenu setStatus:temporaryStatus];
	[statusMenu setSettings:self];
	
	// On affiche le statusMenu.
	[self.navigationController pushViewController:statusMenu animated:YES];
}

// L'utilisateur vient de cliquer sur "Annuler".
- (void) cancel_Clicked:(id)sender 
{
	// Dans ce cas, on se contente de masquer le contrôleur.
	[self.navigationController dismissModalViewControllerAnimated:YES];
}
 
// L'utilisateur vient de cliquer sur "Enregistrer".
- (void) save_Clicked:(id)sender 
{
	// On masque le contrôleur.
	[self.navigationController dismissModalViewControllerAnimated:YES];

	// On stocke le pseudo. Seulement dans la variable nickname pour l'instant, mais idéalement, il faudrait le stocker dans la base de données.
	[self setNickname:[nicknameTextField text]];
	
	// On stocke également le mode invisible (y/n).
	[self setInvisibleMode:[invisibleModeSwitch isOn]];
	
	// On met à jour le statut.
	[self setStatus:temporaryStatus];
	
	
	// Stockage dans la base de données.
	
	// On crée un dictionnaire.
	NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
	
	// On y stocke le pseudo.
	[dictionary setValue:[self nickname] forKey:@"pseudo"];

	// On y stocke le statut.
	[dictionary setValue:[self temporaryStatus] forKey:@"status"];
	
	// On crée une variable décimale pour le stockage de la visibilité.
	NSDecimalNumber *visibility = [[NSDecimalNumber alloc] initWithInt:(![invisibleModeSwitch isOn])];
	[dictionary setValue:visibility forKey:@"visibility"];
	[visibility release];
	
	// On enregistre le dictionnaire.
	[[DatasTruffle getDao] saveSelf:dictionary];
	
	
	// Gestion de la connexion/déconnexion.
	
	// On récupère l'objet GatewayConnection.
	GatewayConnection *gatewayConnection = [[self home] gatewayConnection];
	
	// Si on est en mode invisible, on se déconnecte.
	if ([self invisibleMode]) {
		if ([gatewayConnection disconnect] < 0) {
			// FIXME : seulement un NSLog?
			NSLog(@"Impossible de se déconnecter de la passerelle.");
		}
	}
	// Sinon, on se reconnecte.
	else {
		/*
		if ([gatewayConnection disconnect] < 0) {
			// FIXME : seulement un NSLog?
			NSLog(@"Impossible de se déconnecter de la passerelle.");
		}
		*/
		if ([gatewayConnection connect] < 0) {
			// FIXME : seulement un NSLog?
			NSLog(@"Impossible de se reconnecter à la passerelle.");
		}
	}

	
	//[gatewayConnection release];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload
{}

// Destructeur.
- (void)dealloc
{
	// On appelle le destructeur parent.
    [super dealloc];
	
	// Releases
	[nickname release];
	[status release];
	[temporaryStatus release];
	[statusMenu release];
	[home release];
}


@end
